package com.woniu;

import com.woniu.enums.IErrorCode;
import com.woniu.enums.ResultCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@ApiModel("统一返回结果")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements RespBeanEntityContantns {

    @ApiModelProperty("响应编码")
    private int code;

    @ApiModelProperty("响应信息")
    private String message;

    @ApiModelProperty("响应数据")
    private T data;

    /**
     * 公共的方法
     * @param code          编码
     * @param message       消息
     * @param data          数据
     * @param <T>
     * @return
     */
    private static <T> Result<T> common(int code, String message, T data) {
        return new Result<>(code, message, data);
    }

    /**
     * 成功
     * 1、优化
     *     常量 （把所有的常量都封装到 接口中实现 这个接口 可以使用常量值 ）
     *     枚举  (就是定义一堆常量)
     *          业务编码的枚举
     *          result编码枚举
     *          使用
     *          枚举类.拿到枚举对象.xxx 方法
     *
     * @param <T>
     * @return
     */
    public static <T> Result<T> ok() {

        //return common(1,"成功" , null);     使用值

        //常量的写法
        // return common(RespBeanEntityContantns.SUCCESS_CODE, RespBeanEntityContantns.SUCCESS_MSG , null);
        // 枚举写法
        // ResultCode.SUCCESS 拿到枚举对象
        return common(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage() , null);
    }

    /**
     * 成功   返回数据
     * @param <T>
     * @return
     */
    public static <T> Result<T> ok(T data) {

        return common(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * 成功  返回数据和 信息
     * @param <T>
     * @return
     */
    public static <T> Result<T> ok(int code, String message, T data) {
        return common(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
    }


    /**
     * 失败   返回数据和 信息
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail() {
        return common(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMessage(), null);
    }

    /**
     * 失败 信息
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(String message) {
        return common(ResultCode.FAILED.getCode(), message, null);
    }

    /**
     * 失败   返回数据
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(T data) {
        return common(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMessage(), data);
    }

    /**
     * 失败   返回数据和 信息
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(String message, T data) {
        return common(ResultCode.FAILED.getCode(), message, data);
    }

    /**
     * 失败  响应码
     * @param errorCode
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(IErrorCode errorCode) {
        return common(errorCode.getCode(), errorCode.getMessage(), null);
    }

    /**
     * 失败  响应码  和数据
     * @param errorCode
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(IErrorCode errorCode, T data) {
        return common(errorCode.getCode(), errorCode.getMessage(), data);
    }

}